function createFmsDataDictionary()
    process_each_line()
end

function process_each_line()

    % 打开ICD文件
    
    filename = 'YF_ICD_FMS.csv';
    if ~isfile(filename)
        error('ICD不存在: %s', filename);
    end
    fileID = fopen(filename, 'r');
    if fileID == -1
        error('ICD无法打开: %s', filename);
    end
    headerLine = fgetl(fileID);
    fprintf('ICD结构: %s\n', headerLine);

    % 新建数据字典    
    
    dictName = "YF_ICD_FMS.sldd";
    if isfile(dictName)
        fprintf('删除过时SLDD: %s\n', dictName);
        delete(dictName);
    end
    try
        arch_obj = Simulink.dictionary.archdata.create(dictName);
        fprintf('创建SLDD: %s\n', dictName);
    catch ME
        error('SLDD无法创建: %s', ME.message);
    end
    
    % 处理ICD
    fprintf('开始处理ICD...\n\n');
    lineCount = 0;
    while ~feof(fileID)

        % 读取一行ICD
        line = fgetl(fileID);
        lineCount = lineCount + 1;
        if isempty(line)
            fprintf('跳过空行 %d\n', lineCount);
            continue;
        end
        lineCells = strsplit(line, ',');
                
        % 处理一行ICD
        if length(lineCells) >= 3

            % 获取ICD信息
            fprintf('ICD_%d: ', lineCount);
            for i = 1:length(lineCells)
                fprintf('%s', lineCells{i});
                if i < length(lineCells)
                    fprintf(', ');
                end
            end
            fprintf('\n');

            % 创建数据字典词条
            add_sldd_entry(arch_obj, lineCells)

        else
            fprintf('警告: 行 %d 数据不完整，跳过处理\n', lineCount);
        end
        
        % 每处理10行保存一次，防止数据丢失
        if mod(lineCount, 10) == 0
            try
                arch_obj.save();
                fprintf('已保存数据字典 (第 %d 行)\n', lineCount);
            catch ME
                fprintf('保存数据字典失败: %s\n', ME.message);
            end
        end
    end
    
    % 关闭文件
    fclose(fileID);
    
    % 最终保存数据字典
    try
        arch_obj.save();
        fprintf('最终保存数据字典\n');
    catch ME
        fprintf('最终保存数据字典失败: %s\n', ME.message);
    end
    
    % 关闭数据字典
    try
        arch_obj.close();
        fprintf('已关闭数据字典\n');
    catch ME
        fprintf('关闭数据字典失败: %s\n', ME.message);
    end
    
    % 显示总行数
    fprintf('\n处理完成! 总共处理了 %d 行数据\n', lineCount);
end

function add_sldd_entry(arch_obj, lineCells)
    sldd_interface_name = lineCells{2};    % 接口名称-ICD-FORMAT_NAME
    sldd_interface_element = lineCells{3}; % 元素名称-ICD-DATA_ELEMENT
    sldd_element_data_type = lineCells{4}; % 元素类型-ICD-DATA_TYPE
    try
        interface_obj = arch_obj.getInterface(sldd_interface_name);
    catch ME
        interface_obj = arch_obj.addDataInterface(sldd_interface_name);
    end
    element_obj = interface_obj.addElement(sldd_interface_element);
    element_obj.Type.DataType = validateDataType(sldd_element_data_type);
end

function validatedType = validateDataType(inputType)
    lowerType = lower(strtrim(inputType));% 转换为小写以便不区分大小写比较
    
    % 定义支持的数据类型映射
    typeMap = containers.Map(...
        {...
        'double', ...
        'float', 'single', ...
        'int8', ...
        'uint8', 'uchar', ...
        'int16', ...
        'uint16', 'ushort', ...
        'int', 'integer', 'int32', ...
        'uint', 'uint32', ...
        'bool', 'boolean', 'logical', ...
        'char', ...
        'string', 'str'}, ...
        {...
        'double', ...
        'single', 'single', ...
        'int8', ...
        'uint8', 'uint8', ...
        'int16', ...
        'uint16', 'uint16'...
        'int32', 'int32', 'int32', ...
        'uint32', 'uint32', ...
        'boolean', 'boolean', 'boolean', ...
        'char', ...
        'string', 'string'...
        } ...
    );
    
    % 检查输入类型是否在映射中
    if isKey(typeMap, lowerType)
        validatedType = typeMap(lowerType);
    else
        % 如果是不支持的类型，使用默认值并发出警告
        warning('数据类型 "%s" 不被支持，使用默认类型 "single"', inputType);
        validatedType = 'single';
    end
end